//package org.poem.incrementhandle;
//
//import com.google.common.collect.Lists;
//import com.google.common.collect.Maps;
//import org.poem.CanalClientEntryVO;
//import org.poem.CanalClientHeadEntityVO;
//import org.poem.exec.annotation.CanalHandle;
//import org.poem.enums.EnumDataType;
//import org.poem.create.CanalClientCreateTableEntry;
//import org.poem.handler.increment.AbstractClientIncrementHandler;
//import org.poem.sql.SqlHelperHandler;
//import org.poem.sql.SqlUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
//import org.springframework.jdbc.core.JdbcTemplate;
//import org.springframework.stereotype.Service;
//
//import java.util.List;
//import java.util.Map;
//
///**
// * postgres数据库的处理方式
// *
// * @author poem
// */
//@Service
//@CanalHandle
//public class PostgresCanalIncrementHandler extends AbstractClientIncrementHandler {
//
//
//    private static final Logger logger = LoggerFactory.getLogger(PostgresCanalIncrementHandler.class);
//
//    @Autowired
//    @Qualifier("postgresJdbcTemplate")
//    private JdbcTemplate jdbcTemplate;
//
//    /**
//     * 获取key的数据列
//     * @param canalClientHeadEntityVO
//     * @return
//     */
//    private CanalClientEntryVO getKey(CanalClientHeadEntityVO canalClientHeadEntityVO) throws Exception{
//        for (CanalClientEntryVO entry : canalClientHeadEntityVO.getBeforeEntries()) {
//            if (entry.isKey()){
//                return entry;
//            }
//        }
//        return  null;
//    }
//
//    /**
//     * 删除数据
//     *
//     * @param canalClientHeadEntityVO
//     */
//    @Override
//    protected void delete(CanalClientHeadEntityVO canalClientHeadEntityVO) throws Exception{
//        CanalClientEntryVO entry = getKey(canalClientHeadEntityVO);
//        EnumDataType enumDataType = EnumDataType.POSTGRES;
//        String sql = "";
//        if (entry != null){
//            sql = SqlUtils.createDeleteSqlByKeyColumn(entry, canalClientHeadEntityVO,enumDataType);
//        }else{
//            sql =  SqlUtils.createDeleteSqlColumn(canalClientHeadEntityVO,enumDataType);
//        }
//        logger.info("delete");
//        jdbcTemplate.execute(String.join(";\n",sql));
//
//    }
//
//
//
//    /**
//     * 更新数据
//     *
//     * @param canalClientHeadEntityVO
//     */
//    @Override
//    protected void update(CanalClientHeadEntityVO canalClientHeadEntityVO) throws Exception{
//        CanalClientEntryVO entry = getKey(canalClientHeadEntityVO);
//        EnumDataType enumDataType = EnumDataType.POSTGRES;
//        String sql = "";
//        if (entry != null){
//             sql = SqlUtils.createUpdateSqlByKeyColumn(entry, canalClientHeadEntityVO,enumDataType);
//        }else{
//            sql =  SqlUtils.createUpdateSqlColumn(canalClientHeadEntityVO,enumDataType);
//        }
//        logger.info("update");
//        jdbcTemplate.execute(String.join(";\n",sql));
//    }
//
//    /**
//     * 插入数据
//     *
//     * @param canalClientHeadEntityVO
//     */
//    @Override
//    protected void insert(CanalClientHeadEntityVO canalClientHeadEntityVO) throws Exception{
//        List<Map<String, Object>> metadata = Lists.newArrayList();
//        List<String> columns = Lists.newArrayList();
//        Map<String, String> typeZip = Maps.newHashMap();
//        EnumDataType enumDataType = EnumDataType.POSTGRES;
//        Map<String, Object> result = Maps.newHashMap();
//        for (CanalClientEntryVO beforeEntry : canalClientHeadEntityVO.getEntries()) {
//            columns.add(beforeEntry.getName());
//            typeZip.put(beforeEntry.getName(),beforeEntry.getMysqlType());
//            result.put(beforeEntry.getName(),beforeEntry.getValue());
//        }
//        metadata.add(result);
//        List<String> insertSql = SqlUtils.createInsertSql(canalClientHeadEntityVO.getTableName(), metadata, columns, typeZip, enumDataType);
//        logger.info("insert");
//        jdbcTemplate.execute(String.join(";\n",insertSql));
//    }
//
//
//    /**
//     * 新增表
//     * mysql to postgres
//     *
//     * @param canalClientHeadEntityVO
//     */
//    @Override
//    protected void createTable(CanalClientHeadEntityVO canalClientHeadEntityVO) throws Exception{
//        List<String> createPostgresSql = Lists.newArrayList();
//        for (String s : canalClientHeadEntityVO.getSql()) {
//            List<CanalClientCreateTableEntry> createTableEntries = SqlUtils.parseMysqlSql(s);
//            createPostgresSql.addAll(SqlHelperHandler.getPostgresCreateTableSql(createTableEntries));
//        }
//        logger.info("createTable");
//        jdbcTemplate.execute(String.join(";\n",createPostgresSql));
//    }
//
//    /**
//     * 删除表
//     */
//    @Override
//    protected void deleteTable(CanalClientHeadEntityVO canalClientHeadEntityVO) throws Exception{
//        List<String> deleteTableSqls = Lists.newArrayList();
//        for (String s : canalClientHeadEntityVO.getSql()) {
//            List<CanalClientCreateTableEntry> createTableEntries = SqlUtils.parseMysqlSql(s);
//            deleteTableSqls.addAll(SqlHelperHandler.getPostgresCreateTableSql(createTableEntries));
//        }
//        logger.info("deleteTable");
//        jdbcTemplate.execute(String.join(";\n",deleteTableSqls));
//    }
//}
